CLASE 1: Introducción a R: Potencialidades y usos

##¿Qué es R? ¿Qué es Rstudio?

[R](https://es.wikipedia.org/wiki/R_(lenguaje_de_programaci%C3%B3n) es un software libre especializado en análisis estadítisco y visualización de datos. [Rstudio] es la interfaz que nos permite usar el lenguaje por detrás que es R.

#Para conocer más sobre los creadores de R:
contributors()

###¿Qué significa que sea software libre? Software libre se refiere a la libertad de los usuarios para ejecutar, copiar, distribuir, estudiar, cambiar y mejorar el software. Según GNU La libertad no refiere sólo a la gratuidad, sino más bien a la libertad de manipular y controlar el software.

###¿Por qué R y no otros lenguajes? ¿Cuál es la diferencia con otros lenguajes?

No hay un lenguaje mejor que otro. Hay lenguajes que nos resulta más fáciles que otros. Y con cualquier lenguaje se puede llegar a un resultado similar.

PERO, lo que tiene R a diferencia de otros lenguajes de programación: * COMUNIDAD de gente maravillosa que no tiene problema en contestarte ninguna duda. * Lo que si tiene R es un enfoque estadístico y de visualizaciones muy bueno que lo diferencian de otros lenguajes como Python.

knitr::include_graphics('https://github.com/Guadag12/R4RRII/raw/master/Clase%201/images/comparativa.jpg')

###Otras ventajas de usar R: * R-eproducibilidad en el análisis

Para qué podemos usar R?

  • Limpieza y manipulación de datos
  • Análisis estadísticos (Machine Learning, Deep Learning)
  • Visualizaciones
  • Mapas
  • Dashboards

Comencemos a aprender R!:

Una vez instalado abrimos Rstudio y nos vamos a encontrar con algo así:

knitr::include_graphics("https://github.com/Guadag12/R4RRII/raw/master/Clase%201/images/rstudio_session_4pane_layout.png")

* Source: En este panel vas a escribir/editar/ver los R script y los datasets. * Console/Terminal: Acá es donde se ejecutan los comandos redactados en el editor (Source). * Environment/History: En este panel Rstudio te muestra qué datasets y qué objetos (variables) tenes creadas en la memoria. La solapa “History” contiene el historial de los comandos ejecutados en R. * Files/Plots/Packages/Help: Este es un panel multiproposito que devuelve información solicitada. En “Files” vos podes navegar en tu escritorio y seleccionar archivos que desees. En “Plots” te va a mostrar los gráficos que realices, y si son interactivos van a aparecer en “Viewer”. En “Packages” podes ver cuáles son los paquetes instalados o disponibles. Por último en “Help” vas a poder consultar dudas sobre funciones o paquetes.

  • Qué es un data frame. Qué son los archivos csv. Qué es un texto plano Qué es un texto extructurado / no estructurado

Comencemos a programar en R!:

Dentro de la consola o del editor de texto podemos escribir nuestros códigos / algoritmos. En este sentido un algoritmo -no es más ni menos- que una serie de instrucciones, como una receta de cocina:

#1

1 + 1
## [1] 2
(2 * 2) - 1
## [1] 3
12^2
## [1] 144
sqrt(144)
## [1] 12

Asignacion de variables

Una variable es un nombre que denota una dirección de memoria en la que se almacena un valor. De esa dirección es posible la lectura y/o modificación del valor almacenado.

knitr::include_graphics('https://github.com/Guadag12/R4RRII/raw/master/Clase%201/images/variables.png')

VARIABLE = EXPRESIÓN

En R no se usa tanto el signo “=”, sino que se usa la flecha “<-” para denotar asignacion.

#mi variable "x" tiene el valor 1
x <- 1
x
## [1] 1
#mi variable "y" tiene el valor 2
y <- 2
y
## [1] 2
#si genero una nueva variable "z" que sea la suma de mi variable "x" e "y" su valor va a ser igual a la suma de esas variables 
z <- x + y
z
## [1] 3
#OJO con el nombre de las variables! Porque puedo pisarlas variables y pierdo el valor original
y <- 4

z <- x + y
z
## [1] 5

Asi como puedo asignar números también puedo asignar letras, palabras, combinaciones de caracteres:

H <- "Hello World"
H
## [1] "Hello World"
#A esta cadena le puedo preguntar cuántos valores tiene adentro:
length(H)
## [1] 1
#Y esos valores pueden cambiar:
H <- c("Hello", "World")
length(H)
## [1] 2

###Hagamos nuestro primer proyecto en R!:

Al programar necesitamos tener nuestros trabajos compartimentados y bien organizados. En ese sentido, necesitamos dividir nuestros trabajos en diferentes proyectos. A cada proyecto le asignaremos una carpeta en donde podremos tener nuestros archivos, scripts, notas, resultados.

###Generemos un proyecto para las clases:

knitr::include_graphics("https://github.com/Guadag12/R4RRII/blob/master/Clase%201/images/proyectos.png")

> Proyect(None) > New Project > New directory > Nombre del proyecto: “Clases de R” > Directorio: “D:/Guada/Clases/Clases_R_Eze/Clase 1/” > Create Project

##EMPECEMOS A TRABAJAR EN R!:

###¿Que son los Paquetes y las librerías?

R viene con algunas funciones básicas incluídas, pero puede ser expandido con paquetes. Cada paquete es una colección de funciones diseñadas para atender una tarea específica. Por ejemplo, hay paquetes para trabajo visualización geoespacial, análisis psicométricos, mineria de datos, interacción con servicios de internet y muchas otras cosas más.

Estos paquetes se encuentran alojados en CRAN (“The Comprehensive R Archive Network”). así que pasan por un control riguroso antes de estar disponibles para su uso generalizado.

Una de las cosas maravillosas que tiene R -a diferencia de otros lenguajes- es la documentación de sus paquetes. Siendo que por documentación entendemos una guía de convenciones y buenas prácticas para utilizar un conjunto de funciones ya redactadas.

Cuando haces esto, R importa las funciones contenidas en el paquete al entorno de trabajo actual.

#Podemos cargar los paquetes necesarios así:
install.packages("sf")
## Installing package into 'C:/Users/Usuario/Documents/R/win-library/3.6'
## (as 'lib' is unspecified)
## package 'sf' successfully unpacked and MD5 sums checked
## Warning: cannot remove prior installation of package 'sf'
## Warning in file.copy(savedcopy, lib, recursive = TRUE): problema al copiar C:
## \Users\Usuario\Documents\R\win-library\3.6\00LOCK\sf\libs\x64\sf.dll a C:
## \Users\Usuario\Documents\R\win-library\3.6\sf\libs\x64\sf.dll: Permission denied
## Warning: restored 'sf'
## 
## The downloaded binary packages are in
##  C:\Users\Usuario\AppData\Local\Temp\Rtmpoj0dBZ\downloaded_packages
install.packages("tidyverse")
## Installing package into 'C:/Users/Usuario/Documents/R/win-library/3.6'
## (as 'lib' is unspecified)
## package 'tidyverse' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\Usuario\AppData\Local\Temp\Rtmpoj0dBZ\downloaded_packages
install.packages("ggplot2")
## Installing package into 'C:/Users/Usuario/Documents/R/win-library/3.6'
## (as 'lib' is unspecified)
## package 'ggplot2' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\Usuario\AppData\Local\Temp\Rtmpoj0dBZ\downloaded_packages
install.packages("ggridges")
## Installing package into 'C:/Users/Usuario/Documents/R/win-library/3.6'
## (as 'lib' is unspecified)
## package 'ggridges' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\Usuario\AppData\Local\Temp\Rtmpoj0dBZ\downloaded_packages
install.packages("plotly")
## Installing package into 'C:/Users/Usuario/Documents/R/win-library/3.6'
## (as 'lib' is unspecified)
## package 'plotly' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\Usuario\AppData\Local\Temp\Rtmpoj0dBZ\downloaded_packages
install.packages("viridis")
## Installing package into 'C:/Users/Usuario/Documents/R/win-library/3.6'
## (as 'lib' is unspecified)
## package 'viridis' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\Usuario\AppData\Local\Temp\Rtmpoj0dBZ\downloaded_packages
install.packages("leaflet")
## Installing package into 'C:/Users/Usuario/Documents/R/win-library/3.6'
## (as 'lib' is unspecified)
## package 'leaflet' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\Usuario\AppData\Local\Temp\Rtmpoj0dBZ\downloaded_packages

Es importante que tengas en mente que debes hacer una llamada a library() cada que inicies una sesión en R. Aunque hayas importado las funciones de un paquete con anterioridad, las sesiones de R se inician “limpias”, sólo con los objetos y funciones de base.

Este comportamiento es para evitar problemas de compatibilidad y para propiciar buenas prácticas de colaboración.

Si importamos paquetes automáticamente y usamos sus funciones sin indicar de donde provienen, al compartir nuestro código con otras personas, estas no tendrán la información completa para entender qué estamos haciendo. R, al pedirnos que cada sesión indiquemos qué estamos importando, nos obliga a ser explícito con todo lo que estamos haciendo. Es un poco latoso, pero te acostumbras a ello.

library(sf)
## Warning: package 'sf' was built under R version 3.6.2
## Linking to GEOS 3.6.1, GDAL 2.2.3, PROJ 4.9.3
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 3.6.2
## -- Attaching packages --------------------------------------------------------------------------------- tidyverse 1.3.0 --
## <U+2713> ggplot2 3.2.1     <U+2713> purrr   0.3.3
## <U+2713> tibble  2.1.3     <U+2713> dplyr   0.8.3
## <U+2713> tidyr   1.0.0     <U+2713> stringr 1.4.0
## <U+2713> readr   1.3.1     <U+2713> forcats 0.4.0
## Warning: package 'ggplot2' was built under R version 3.6.2
## Warning: package 'tibble' was built under R version 3.6.2
## Warning: package 'tidyr' was built under R version 3.6.2
## Warning: package 'readr' was built under R version 3.6.2
## Warning: package 'purrr' was built under R version 3.6.2
## Warning: package 'dplyr' was built under R version 3.6.2
## Warning: package 'stringr' was built under R version 3.6.2
## Warning: package 'forcats' was built under R version 3.6.2
## -- Conflicts ------------------------------------------------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
library(ggplot2)
library(ggridges)
## Warning: package 'ggridges' was built under R version 3.6.2
library(plotly)
## Warning: package 'plotly' was built under R version 3.6.2
## 
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## The following object is masked from 'package:stats':
## 
##     filter
## The following object is masked from 'package:graphics':
## 
##     layout
library(viridis)
## Warning: package 'viridis' was built under R version 3.6.2
## Loading required package: viridisLite
## Warning: package 'viridisLite' was built under R version 3.6.2
library(leaflet)
## Warning: package 'leaflet' was built under R version 3.6.2

Hoy vamos a trabajar con un dataset del Banco Mundial sobre Porcentaje del PBI destinado a defensa para más de 160 países.

Carguemos los archivos que necesitamos para trabajar!:

Nosotros vamos a trabajar con archivos CSV, pero a R se le pueden cargar todo tipo de archivos (txt, excels, words, pdf, SPSS, SAS, Stata, json, geojson, etc).

Los csv (“Comma Separated Values”, .csv) son los archivos separados por comas. Este es un tipo de archivo comunmente usado para compartir datos, además de ser un formato libre - no privativo como excel, word o pdf -, sumado a que pesan significativamente menos y hace más rápido y cómodo el intercambio de información.

Para cargar nuestro archivo, debemos usar la función read.csv():

data <- read.csv("https://github.com/Guadag12/R4RRII/raw/master/Clase%201/presupuesto_defensa.csv")

Una vez que tenemos el archivo cargado podemos empezar a trabajar. En general, estos archivos se busca que esten en formato tidy.

En principio, vamos a revisar información básica sobre nuestra data. La función head() nos permite ver las primeras 6 filas de nuestro :

head(data)
##   X Country_name Code Year Mean_PBI Continent Sub_Continent     Country PBI_USD
## 1 1  Afghanistan  AFG 1970 1.629606      Asia Southern Asia Afghanistan      NA
## 2 2  Afghanistan  AFG 1973 1.868910      Asia Southern Asia Afghanistan      NA
## 3 3  Afghanistan  AFG 1974 1.610825      Asia Southern Asia Afghanistan      NA
## 4 4  Afghanistan  AFG 1975 1.722066      Asia Southern Asia Afghanistan      NA
## 5 5  Afghanistan  AFG 1976 2.046087      Asia Southern Asia Afghanistan      NA
## 6 6  Afghanistan  AFG 1977 2.011475      Asia Southern Asia Afghanistan      NA

Si queremos ver medidas de resumen como frecuencias, media, mediana, cuartiles y rango muestrales sobre nuestros datos, podemos usar la función summary, que es muy útil para tener una primera aproximación a nuestra data.

summary(data)
##        X              Country_name       Code           Year     
##  Min.   :   1   Argentina   :  58   ARG    :  58   Min.   :1960  
##  1st Qu.:1721   Australia   :  58   AUS    :  58   1st Qu.:1980  
##  Median :3442   Austria     :  58   AUT    :  58   Median :1994  
##  Mean   :3442   Belgium     :  58   BEL    :  58   Mean   :1992  
##  3rd Qu.:5162   Brazil      :  58   BFA    :  58   3rd Qu.:2006  
##  Max.   :6882   Burkina Faso:  58   BRA    :  58   Max.   :2017  
##                 (Other)     :6534   (Other):6534                 
##     Mean_PBI          Continent               Sub_Continent 
##  Min.   :  0.000   Africa  :2141   Eastern Africa    : 695  
##  1st Qu.:  1.217   Americas:1253   Western Africa    : 678  
##  Median :  1.963   Asia    :1664   Western Asia      : 617  
##  Mean   :  2.784   Europe  :1620   South America     : 605  
##  3rd Qu.:  3.240   Oceania : 204   Northern Europe   : 481  
##  Max.   :117.350                   South-Eastern Asia: 440  
##                                    (Other)           :3366  
##          Country        PBI_USD          
##  Argentina   :  58   Min.   :-2.591e+10  
##  Australia   :  58   1st Qu.: 3.187e+07  
##  Austria     :  58   Median : 2.307e+08  
##  Belgium     :  58   Mean   : 3.859e+08  
##  Brazil      :  58   3rd Qu.: 5.391e+08  
##  Burkina Faso:  58   Max.   : 3.007e+10  
##  (Other)     :6534   NA's   :439

Una vez que tengamos una noción inicial de cómo funciona y qué tipo de información contiene nuestro data frame, podemos empezar a hacernos preguntas más atinadas. Por ejemplo, ¿cuál es el promedio por país del porcente de PBI dedicado por década?

##Manipulación de datos

En este sentido, y como sabemos, R comenzó como un programa para matemáticos y estadísticos, y eso nos permite hacer operaciones más o menos complejas. En este caso, vamos a empezar con algo simple usando la librería tidyverse: vamos a generar un nuevo dataset llamado data_agrupada y que va a contener las variables agrupadas por las columnas “Year_group” (década correspondiente) y “Country_name” (nombre del país) con la funcion group_by(). Además vamos a generar una nueva columna llamada “Mean_decade_group” (decade) con la funcion mutate(). Esta nueva columna va a tener el promedio para la década correspondiente. Por otro lado, vamos a decirle a R que columnas queremos que nos muestre en este nuevo dataset con la funcion select()

data_agrupada <- data %>% group_by(Year, Country_name, Continent, Sub_Continent) %>%  summarise(Mean_year_group = mean(Mean_PBI)) %>% select(Country_name, Year, Mean_year_group, Continent, Sub_Continent)

Y ahora, vamos a usar la función tail() para saber cómo nos queda nuestro data frame. Esta función tail() logra lo mismo que head() pero en vez de mostrarnos las primeras 6 observaciones, nos muestra las últimas 6.

tail(data_agrupada)
## # A tibble: 6 x 5
## # Groups:   Year, Country_name, Continent [6]
##   Country_name   Year Mean_year_group Continent Sub_Continent     
##   <fct>         <int>           <dbl> <fct>     <fct>             
## 1 United States  2017           3.15  Americas  Northern America  
## 2 Uruguay        2017           2.05  Americas  South America     
## 3 Venezuela      2017           0.488 Americas  South America     
## 4 Vietnam        2017           2.29  Asia      South-Eastern Asia
## 5 Zambia         2017           1.34  Africa    Eastern Africa    
## 6 Zimbabwe       2017           1.97  Africa    Eastern Africa

¿Qué pasa si queremos obtener información sobre un subgrupo en particular? Por ejemplo, si queremos saber los porcentajes de PBI destinado por los diferentes países de América desde 2010. Para filtrar en R, usamos la funcióN filter().

data_sudamerica <- data_agrupada %>% 
  filter(Sub_Continent == "South America") 

##Visualización de datos ¿Y si queremos graficar la distribución del porcentaje de PBI destinado a defensa?… podemos hacer un RIDGELINE!

ggplot(data_sudamerica, aes(x = Mean_year_group, y = Country_name, fill = Country_name)) +
  geom_density_ridges() +
  theme_ridges() + 
  theme(legend.position = "Center") +
  labs(title ="Distribución del % de PBI destinado a Defensa", x = "% destinado", y = "Países") +
  scale_fill_viridis(discrete = TRUE) +
  scale_color_viridis(discrete=TRUE) 
## Picking joint bandwidth of 0.4

También podemos jugar con los datos y hacer gráficos interactivo!

Cómo podemos saber cómo fue el comportamiento de nuestros países vecinos y de la Argentina en cuanto a la distribución del porcentaje destinado a defensa del 69 en adelante?

data_arg <- data %>% 
  filter(Country_name == "Argentina") 
data_bra <- data %>% 
  filter(Country_name == "Brazil") 
data_bol <- data %>% 
  filter(Country_name == "Bolivia") 
data_ch <- data %>% 
  filter(Country_name == "Chile") 
data_par <- data %>% 
  filter(Country_name == "Paraguay")  
data_uru <- data %>% 
  filter(Country_name == "Uruguay")  

p <- plot_ly(
#argentina
  type = "scatter",
  x = data_arg$Year, 
  y = data_arg$Mean_PBI,
  name = 'ARGENTINA',
  mode = "lines",
  line = list(
        color = '#17BECF'
  )) %>%
#brasil
  add_trace(
    type = "scatter",
    x = data_bra$Year, 
    y = data_bra$Mean_PBI,
    name = 'BRASIL',
    mode = "lines",
    line = list(
        color = '#188324'
  )) %>%
#bolivia
   add_trace(
    type = "scatter",
    x = data_bol$Year, 
    y = data_bol$Mean_PBI,
    name = 'BOLIVIA',
    mode = "lines",
    line = list(
        color = '#EEFB6B'
  )) %>%
#chile
   add_trace(
    type = "scatter",
    x = data_ch$Year, 
    y = data_ch$Mean_PBI,
    name = 'CHILE',
    mode = "lines",
    line = list(
        color = '#2D00C4'
  )) %>%
#paraguay
   add_trace(
    type = "scatter",
    x = data_par$Year, 
    y = data_par$Mean_PBI,
    name = 'PARAGUAY',
    mode = "lines",
    line = list(
        color = '#C41E1E'
  )) %>%
#uruguay
    add_trace(
    type = "scatter",
    x = data_uru$Year, 
    y = data_uru$Mean_PBI,
    name = 'URUGUAY',
    mode = "lines",
    line = list(
        color = '#1F7CB9'
  )) %>%
  layout(
    title = "Evolución del presupuesto de Defensa para Argentina y sus vecinos",
    xaxis = list(
        type = 'date',
        tickformat = "%Y"
  ))

p

##Estadística con R Otra de las cosas que permite hacer R es generar análisis estadísticos a partir de grandes bases de datos. Por ejemplo, ¿qué pasa si queremos conocer si hay una relación entre el aumento o la disminución del PBI y el porcentaje que los países le dedican a su defensa?

cor(data$PBI_USD, data$Mean_PBI,  use = "complete.obs") 
## [1] 0.02590881

¿Y en el caso de que queramos graficarla con una regresión lineal?

p3 <- ggplot(data, aes(x=PBI_USD, y=Mean_PBI)) +
  geom_point() +
  geom_smooth(method=lm , color="#238A8DFF", fill="#95D840FF", se=TRUE) +
  theme_classic() +
  coord_cartesian(ylim = c(0,35)) 
p3
## Warning: Removed 439 rows containing non-finite values (stat_smooth).
## Warning: Removed 439 rows containing missing values (geom_point).

##Mapeando con R! De la misma manera que trajimos un csv, vamos a aprender a trabajar con formatos de georeferenciación. El geojson es uno de ellos. Traigamoslo!

mapa_paises <- st_read("https://datahub.io/core/geo-countries/r/countries.geojson")
## Reading layer `countries' from data source `https://datahub.io/core/geo-countries/r/countries.geojson' using driver `GeoJSON'
## Simple feature collection with 255 features and 2 fields
## geometry type:  MULTIPOLYGON
## dimension:      XY
## bbox:           xmin: -180 ymin: -90 xmax: 180 ymax: 83.6341
## epsg (SRID):    4326
## proj4string:    +proj=longlat +datum=WGS84 +no_defs
head(mapa_paises)
## Simple feature collection with 6 features and 2 fields
## geometry type:  MULTIPOLYGON
## dimension:      XY
## bbox:           xmin: -70.06241 ymin: -18.0314 xmax: 74.89231 ymax: 60.48078
## epsg (SRID):    4326
## proj4string:    +proj=longlat +datum=WGS84 +no_defs
##         ADMIN ISO_A3                       geometry
## 1       Aruba    ABW MULTIPOLYGON (((-69.99694 1...
## 2 Afghanistan    AFG MULTIPOLYGON (((71.0498 38....
## 3      Angola    AGO MULTIPOLYGON (((11.73752 -1...
## 4    Anguilla    AIA MULTIPOLYGON (((-63.03767 1...
## 5     Albania    ALB MULTIPOLYGON (((19.74777 42...
## 6       Aland    ALA MULTIPOLYGON (((20.92018 59...

Una de las ventajas de trabajar con R es que podemos trabajar no sólo con más de dos datasets al mismo tiempo, sino que podemos unirlos y generar uno nuevo que contenga ambos datasets… usando la función join().

names(mapa_paises)[2] <- "Code" #Cambiamos el nombre de la columna "ISO-A3" a "Code" para poder hacer el join
data_map <- inner_join( mapa_paises, data, by = "Code")
## Warning: Column `Code` joining factors with different levels, coercing to
## character vector

Y ahora si, ya podemos hacer un mapa de, por ejemplo, el porcentaje destinado a defensa para cada uno de los países!!

data_map_17 <- data_map %>% filter(Year == "2017") #filtramos el año 2017
ggplot() + 
    geom_sf(data = data_map_17, aes(fill = Mean_PBI), color = NA) +
    scale_fill_viridis_c() +
    labs(title = "Promedio Presupuesto de Defensa",
         subtitle = "Durante 2017",
         fill = "Mean_PBI")

De la misma manera, podemos hacer un mapa interactivo para conocer un poco más de información detallada para cada país:

#generamos la paleta de colores
mypalette <- colorNumeric( palette="viridis",  domain=data_map_17$Mean_PBI, na.color="transparent")
mypalette(c(45,43))
## Warning in mypalette(c(45, 43)): Some values were outside the color scale and
## will be treated as NA
## [1] "transparent" "transparent"
#le decimos a R qué información queremos que nos dé en el mapa
mytext <- paste(
    "País: ", data_map_17$Country_name,"<br/>",
    "Porcentaje_PBI: ", round(data_map_17$Mean_PBI, 2), 
    sep="") %>%
  lapply(htmltools::HTML)

#armamos el mapa
m <- leaflet(data_map_17) %>% 
  addTiles()  %>% 
  setView( lat=10, lng=0 , zoom=2) %>%
  addPolygons( fillColor = ~mypalette(Mean_PBI), stroke=FALSE, label = mytext, smoothFactor = 0.7 )

m